package com.hoshiicloud.common.query;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author linjx on 2019/8/22
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OmnipotentWrapper<T> implements Serializable {

    /**
     *  字段名称
     */
    private String fieldName;

    /**
     *  字段值
     */
    private Object fieldValue;

    /**
     *  查询的方式
     */
    private String type;


    public static OmnipotentWrapper setWrapper(String type, String fieldName, Object fieldValue ){
        return OmnipotentWrapper.builder().type(type).fieldName(fieldName).fieldValue(fieldValue).build();
    }


    public QueryWrapper<T> getWrapper(List<OmnipotentWrapper> wrappers) {
        QueryWrapper<T> wrapper = new QueryWrapper<>();
        wrappers.forEach(s -> {
            if ("in".equals(s.getType())) {
                wrapper.in(s.getFieldName(), (Collection)s.getFieldValue());
            }
            if ("eq".equals(s.getType())) {
                wrapper.eq(s.getFieldName(), s.getFieldValue());
            }

            if ("ne".equals(s.getType())) {
                wrapper.ne(s.getFieldName(), s.getFieldValue());
            }

            if ("like".equals(s.getType())) {
                wrapper.like(s.getFieldName(), s.getFieldValue());
            }

            if ("lt".equals(s.getType())) {
                wrapper.lt(s.getFieldName(), s.getFieldValue());
            }

            if ("ge".equals(s.getType())) {
                wrapper.ge(s.getFieldName(), s.getFieldValue());
            }

            if ("isNull".equals(s.getType())) {
                wrapper.isNull(s.getFieldName());
            }
        });
        return wrapper;
    }

    public UpdateWrapper<T> getUpdateWrapper(List<OmnipotentWrapper> wrappers) {
        UpdateWrapper<T> updateWrapper = new UpdateWrapper<>();
        wrappers.forEach(s -> {
            if ("in".equals(s.getType())) {
                updateWrapper.in(s.getFieldName(), (Collection)s.getFieldValue());
            }
            if ("eq".equals(s.getType())) {
                updateWrapper.eq(s.getFieldName(), s.getFieldValue());
            }

            if ("ne".equals(s.getType())) {
                updateWrapper.ne(s.getFieldName(), s.getFieldValue());
            }

            if ("like".equals(s.getType())) {
                updateWrapper.like(s.getFieldName(), s.getFieldValue());
            }

            if ("lt".equals(s.getType())) {
                updateWrapper.lt(s.getFieldName(), s.getFieldValue());
            }

            if ("ge".equals(s.getType())) {
                updateWrapper.ge(s.getFieldName(), s.getFieldValue());
            }

            if ("isNull".equals(s.getType())) {
                updateWrapper.isNull(s.getFieldName());
            }
        });
        return updateWrapper;
    }
}
